package com.zj.dmsproxy.interfaces.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zj.baseproxy.model.Page;
import com.zj.dmsproxy.interfaces.DmsBaseMapper;
import com.zj.dmsproxy.interfaces.DmsProxy;
import com.zj.dmsproxy.wrapper.DmsWrapper;
import net.bytebuddy.implementation.bind.annotation.This;

import javax.annotation.Resource;
import java.util.function.Consumer;
import java.util.function.Function;

/**
 * @author arthur_zhou
 * @date 2023/10/8 12:10
 */
public class DmsBaseMapperImpl {

    @Resource
    private DmsProxy dmsProxy;

    /**
     * 请求dms获取数据
     *
     * @param json       请求json
     * @param baseMapper 请求这个方法的对象
     * @return 响应json
     */
    public JSONObject getJson(String json, @This DmsBaseMapper<?> baseMapper) {
        return dmsProxy.getJsonData(baseMapper.getDmsInfo(), json);
    }

    /**
     * 请求dms获取数据
     *
     * @param wrapper    拼接器
     * @param baseMapper 请求这个方法的对象
     * @return 响应json
     */
    public JSONObject getJson(DmsWrapper wrapper, @This DmsBaseMapper<?> baseMapper) {
        return dmsProxy.getJsonData(baseMapper.getDmsInfo(), JSON.toJSONString(wrapper));
    }

    /**
     * 请求dms获取数据
     *
     * @param json       请求json
     * @param baseMapper 请求这个方法的对象
     * @return 响应
     */
    public <T> Page<T> get(String json, @This DmsBaseMapper<T> baseMapper) {
        return dmsProxy.getData(baseMapper.getTypeClz(), baseMapper.getDmsInfo(), json);
    }

    /**
     * 请求dms获取数据
     *
     * @param json       请求json
     * @param baseMapper 请求这个方法的对象
     */
    public void foreach(String json, Consumer<JSONObject> consumer, @This DmsBaseMapper<?> baseMapper) {
        dmsProxy.foreach(baseMapper.getDmsInfo(), json, consumer);
    }

    /**
     * 请求dms获取数据
     *
     * @param json       请求json
     * @param baseMapper 请求这个方法的对象
     * @return 响应
     */
    public <T> Page<T> map(String json, Function<JSONObject, T> func, @This DmsBaseMapper<?> baseMapper) {
        return dmsProxy.map(baseMapper.getDmsInfo(), json, func);
    }

    /**
     * 请求dms获取数据
     *
     * @param json       请求json
     * @param baseMapper 请求这个方法的对象
     * @return 响应
     */
    public <T> Page<T> get(String json, Class<T> clazz, @This DmsBaseMapper<?> baseMapper) {
        return dmsProxy.getData(clazz, baseMapper.getDmsInfo(), json);
    }

    /**
     * 请求dms获取数据
     *
     * @param wrapper    条件拼接器
     * @param baseMapper 请求这个方法的对象
     * @return 响应json
     */
    public <T> Page<T> get(DmsWrapper wrapper, Class<T> clazz, @This DmsBaseMapper<?> baseMapper) {
        return dmsProxy.getData(clazz, baseMapper.getDmsInfo(), JSON.toJSONString(wrapper));
    }

    /**
     * 请求dms获取数据
     *
     * @param wrapper    条件拼接器
     * @param baseMapper 请求这个方法的对象
     * @return 响应json
     */
    public <T> Page<T> get(DmsWrapper wrapper, @This DmsBaseMapper<T> baseMapper) {
        return dmsProxy.getData(baseMapper.getTypeClz(), baseMapper.getDmsInfo(), JSON.toJSONString(wrapper));
    }

    /**
     * 请求dms
     *
     * @param wrapper    条件拼接器
     * @param consumer   函数
     * @param baseMapper 请求这个方法的对象
     */
    public void foreach(DmsWrapper wrapper, Consumer<JSONObject> consumer, @This DmsBaseMapper<?> baseMapper) {
        dmsProxy.foreach(baseMapper.getDmsInfo(), JSON.toJSONString(wrapper), consumer);
    }

    /**
     * 请求dms，收集获取数据
     *
     * @param wrapper    条件拼接器
     * @param func       收集函数
     * @param baseMapper 请求这个方法的对象
     * @return 响应json
     */
    public <T> Page<T> map(DmsWrapper wrapper, Function<JSONObject, T> func, @This DmsBaseMapper<?> baseMapper) {
        return dmsProxy.map(baseMapper.getDmsInfo(), JSON.toJSONString(wrapper), func);
    }
}
